﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using DAL.Repositories;
using EntitiesLayer;
using DAL.AbstractRepositories;
using System.Data;
using EntitiesLayer;
using System.Data.SqlClient;

namespace DAL.Repositorios
{
    public class PlanEntrenamientoRepository : DAL.AbstractRepositories.AbstractRepository<PlanEntrenamiento>
    {


            public override void Insert(PlanEntrenamiento entity)
            {
                Inserted.Add(entity);
            }

            public override void Update(PlanEntrenamiento entity)
            {
                Updated.Add(entity);
            }

        

            public override PlanEntrenamiento GetById(int id)
            {
                PlanEntrenamiento plan = null;

                SqlCommand cmd = new SqlCommand();
                cmd.Parameters.Add(new SqlParameter("@IdPlan", id));
                DataSet ds = DBAccess.ExecuteSPWithDS(ref cmd, "PaConsultarPlanEntrenamiento");

                foreach (DataRow dr in ds.Tables[0].Rows)
                    plan = CrearPE(dr);
            

                return plan;
            }


            protected override void UpdateEntity(PlanEntrenamiento plan) {

                SqlCommand cmd = new SqlCommand();

                cmd.Parameters.Add(new SqlParameter("@IdPlan", plan.Id));
                cmd.Parameters.Add(new SqlParameter("@IdCoordinador", plan.IdCoordiandor));
                cmd.Parameters.Add(new SqlParameter("@NotaCoordinador", plan.NotaCoordiandor));
                cmd.Parameters.Add(new SqlParameter("@Estado", (char)plan.Estado));



                DBAccess.ExecuteSPNonQuery(ref cmd, "PaModificarPlan");
            
            }

            protected override void InsertEntity(PlanEntrenamiento plan) { 
                
                

                SqlCommand cmd = new SqlCommand();
                //cambiar si no da tiempo
                cmd.Parameters.Add(new SqlParameter("@IdPruebaResistencia", DBNull.Value));
                cmd.Parameters.Add(new SqlParameter("@IdObjetivo", plan.Objetivo.Id));
                cmd.Parameters.Add(new SqlParameter("@IdInstructor", plan.IdFuncionario));
                cmd.Parameters.Add(new SqlParameter("@IdCliente", plan.IdCliente));
                cmd.Parameters.Add(new SqlParameter("@FechaHoraCreacion", plan.FechahoraCreacion));
                cmd.Parameters.Add(new SqlParameter("@NotaInstructor", plan.NotaInstructor));
                cmd.Parameters.Add(new SqlParameter("@FechaHoraRevision", plan.fechaHoraRevision));
                cmd.Parameters.Add(new SqlParameter("@Estado", (char)plan.Estado));


                long id = DBAccess.ExecuteSPScalar(ref cmd, "PaRegistrarPlan");

                this.IdAutoGenerados.Add(plan, id);

                IRepository<DetallePlan> repoDetalle = UnitOfWork.RepositoryDetalles;

                foreach (DetallePlan de in plan.Detalles)
                {
                    de.IdPlan = (int)id;
                    repoDetalle.Insert(de);
                }

                repoDetalle.Save();
            
            }

            protected PlanEntrenamiento CrearPE(DataRow dr){
            
                /*
             
                - [IdPlanE],
	
	    falta [IdObjetivo],
	    -[IdInstructor],
	    -[IdCliente],
	    [FechaHoraCreacion],
	    [NotaInstructor],
	    [FechaHoraRevision],
	    -[IdCoordinadorRevisa],
	    [NotaCoordinador],
	    [Estado]
             
                 */

                IRepositoryConsultar<ObjetivoPE> repo= UnitOfWork.RepositoryObjetivos;
                DetallesPlanRepository repoD = (DetallesPlanRepository)(UnitOfWork.RepositoryDetalles);
                int idPlan=  dr.Field<int>("IdPlanE");
                
                return new PlanEntrenamiento.BuilderPlan()
                {
                    IdCliente= dr.Field<int>("IdCliente"),
                    Id= idPlan,
                    IdFuncionario= dr.Field<int>("IdInstructor"),
                    IdCoordiandor= dr["IdCoordinadorRevisa"].SafeDBNull<int>(),
                    FechahoraCreacion= dr.Field<DateTime>("FechaHoraCreacion"),
                    NotaInstructor= dr.Field<string>("NotaInstructor"),
                    fechaHoraRevision= dr.Field<DateTime>("FechaHoraRevision"),
                    NotaCoordiandor = dr["NotaCoordinador"].SafeDBNull<string>(),
                    Estado= (EstadoPlan)Convert.ToChar(dr["Estado"]),
                    Objetivo= repo.GetById(dr.Field<int>("IdObjetivo")),
                    Detalles= repoD.consultarDetallesDePlan(idPlan)
            
                }.Build();



            }


            internal IList<PlanEntrenamiento> consultarPlanesDeCliente(int idCliente){

                IList<PlanEntrenamiento> plan = new List<PlanEntrenamiento>();

                SqlCommand cmd = new SqlCommand();
                cmd.Parameters.Add(new SqlParameter("@IdCliente", idCliente));
                DataSet ds = DBAccess.ExecuteSPWithDS(ref cmd, "PaConsultarPlanEntrenamientoDeCliente");

                foreach (DataRow dr in ds.Tables[0].Rows)
                    plan.Add(CrearPE(dr));


                return plan.Count > 0 ? plan : null; ;
        
            }

      
    }
}
